/*
 * shift_reg.h
 *
 *  Created on: Jan 30, 2025
 *      Author: wzx05
 */

#ifndef INC_MOTOR_SHIFT_REG_H_
#define INC_MOTOR_SHIFT_REG_H_

#include "stm32f1xx_hal.h"

// 74HC595移位寄存器句柄
typedef struct {
    GPIO_TypeDef* ser_port;
    uint16_t ser_pin;
    GPIO_TypeDef* srclk_port;
    uint16_t srclk_pin;
    GPIO_TypeDef* rclk_port;
    uint16_t rclk_pin;
} ShiftReg_Handle;

typedef enum {
    SHIFTREG_STATE_IDLE,
    SHIFTREG_STATE_OUTPUT_HIGH,
    SHIFTREG_STATE_OUTPUT_LOW,
    SHIFTREG_STATE_DONE
} ShiftRegState;

typedef struct {
    const ShiftReg_Handle* hreg;   // 当前操作的移位寄存器句柄
    uint16_t data;                 // 要输出的数据
    int8_t bit_index;              // 当前输出的位索引（从15到0）
    ShiftRegState state;           // 当前状态机状态
} ShiftReg_Transfer;

// 初始化移位寄存器接口
void ShiftReg_Init(const ShiftReg_Handle* hreg);

// 初始化移位寄存器输出状态机（用于实现基于定时器的非阻塞延迟输出，基于定时器频率控制GPIO波形脉宽）
//void ShiftReg_StartTransfer(ShiftReg_Transfer* transfer, const ShiftReg_Handle* hreg, uint16_t data);
void ShiftReg_StartTransfer(ShiftReg_Transfer* transfer, uint16_t data);

// 移位寄存器的状态机的运行Handle，用于在硬中断中调用
void ShiftReg_TransferHandler(ShiftReg_Transfer* transfer);

// 写入16位数据到移位寄存器（MSB优先，非阻塞）
void ShiftReg_Write16(const ShiftReg_Handle* hreg, uint16_t data);

#endif /* INC_MOTOR_SHIFT_REG_H_ */
